// pages/saved-files/saved-files.js
Page({
  data: {
    savedFiles: [],
    startX: 0, // 触摸开始位置
    moveX: 0,  // 移动距离
    isMultiSelectMode: false, // 是否处于多选模式
    selectedFiles: [] // 已选择的文件索引数组
  },
  
  onLoad: function() {
    this.loadSavedFiles();
  },
  
  onShow: function() {
    // 每次显示页面时刷新文件列表
    this.loadSavedFiles();
  },
  
  // 加载已保存的文件
  loadSavedFiles: function() {
    // 获取当前用户的唯一标识
    const userInfo = wx.getStorageSync('userInfo') || {};
    const openId = userInfo.openId || 'default_user';
    
    // 使用用户特定的键名来存储文件记录
    const savedFilesKey = `savedFiles_${openId}`;
    const savedFiles = wx.getStorageSync(savedFilesKey) || [];
    
    // 验证文件是否仍然存在
    const validFiles = [];
    const fs = wx.getFileSystemManager();
    
    for (const file of savedFiles) {
      try {
        // 检查文件是否存在
        fs.accessSync(file.path);
        validFiles.push({
          ...file,
          selected: false // 添加选择状态属性
        });
      } catch (err) {
        console.warn('文件不存在或无法访问:', file.path);
      }
    }
    
    // 更新存储中的有效文件列表
    if (validFiles.length !== savedFiles.length) {
      wx.setStorageSync(savedFilesKey, validFiles);
    }
    
    this.setData({
      savedFiles: validFiles,
      selectedFiles: []
    });
  },
  
  // 进入多选模式
  enterMultiSelectMode: function(e) {
    if (this.data.isMultiSelectMode) return;
    
    const index = e.currentTarget.dataset.index;
    let savedFiles = this.data.savedFiles;
    
    // 标记当前长按的文件为已选择
    savedFiles[index].selected = true;
    
    this.setData({
      isMultiSelectMode: true,
      savedFiles: savedFiles,
      selectedFiles: [index]
    });
    
    // 震动反馈
    wx.vibrateShort({
      type: 'medium'
    });
  },
  
  // 取消多选模式
  cancelMultiSelect: function() {
    let savedFiles = this.data.savedFiles;
    
    // 清除所有选择状态
    savedFiles.forEach(file => {
      file.selected = false;
    });
    
    this.setData({
      isMultiSelectMode: false,
      savedFiles: savedFiles,
      selectedFiles: []
    });
  },
  
  // 切换文件选择状态
  toggleSelectFile: function(e) {
    const index = e.currentTarget.dataset.index;
    let savedFiles = this.data.savedFiles;
    let selectedFiles = this.data.selectedFiles;
    
    // 切换选择状态
    savedFiles[index].selected = !savedFiles[index].selected;
    
    // 更新选择列表
    if (savedFiles[index].selected) {
      selectedFiles.push(index);
    } else {
      selectedFiles = selectedFiles.filter(i => i !== index);
    }
    
    this.setData({
      savedFiles: savedFiles,
      selectedFiles: selectedFiles
    });
  },
  
  // 全选
  selectAll: function() {
    let savedFiles = this.data.savedFiles;
    let selectedFiles = [];
    
    // 检查是否已经全选
    const allSelected = savedFiles.every(file => file.selected);
    
    // 如果已经全选，则取消全选；否则全选
    savedFiles.forEach((file, index) => {
      file.selected = !allSelected;
      if (!allSelected) {
        selectedFiles.push(index);
      }
    });
    
    this.setData({
      savedFiles: savedFiles,
      selectedFiles: selectedFiles
    });
  },
  
  // 打开文件
  openFile: function(e) {
    const index = e.currentTarget.dataset.index;
    const file = this.data.savedFiles[index];
    
    if (!file || !file.path) {
      wx.showToast({
        title: '文件路径无效',
        icon: 'none'
      });
      return;
    }
    
    if (file.type === 'pdf') {
      // 打开PDF文件
      wx.openDocument({
        filePath: file.path,
        showMenu: true, // 显示右上角菜单
        success: () => {
          console.log('打开PDF文件成功');
        },
        fail: (err) => {
          console.error('打开PDF文件失败:', err);
          wx.showToast({
            title: '无法打开PDF文件',
            icon: 'none'
          });
        }
      });
    } else {
      // 预览图片
      wx.previewImage({
        urls: [file.path],
        current: file.path,
        showmenu: true, // 显示长按菜单
        fail: (err) => {
          console.error('预览图片失败:', err);
          wx.showToast({
            title: '无法预览图片',
            icon: 'none'
          });
        }
      });
    }
  },
  
  // 分享文件
  shareFile: function(e) {
    const index = e.currentTarget.dataset.index;
    const file = this.data.savedFiles[index];
    
    if (!file || !file.path) {
      wx.showToast({
        title: '文件路径无效',
        icon: 'none'
      });
      return;
    }
    
    this._shareFile(file);
  },
  
  // 分享选中的文件
  shareSelectedFiles: function() {
    if (this.data.selectedFiles.length === 0) return;
    
    // 如果只选择了一个文件，直接分享
    if (this.data.selectedFiles.length === 1) {
      const index = this.data.selectedFiles[0];
      const file = this.data.savedFiles[index];
      this._shareFile(file);
      return;
    }
    
    // 如果选择了多个文件，提示用户
    wx.showModal({
      title: '分享多个文件',
      content: '您选择了多个文件，微信小程序限制只能一次分享一个文件。请选择操作方式：',
      confirmText: '分享第一个',
      cancelText: '取消',
      success: (res) => {
        if (res.confirm) {
          const index = this.data.selectedFiles[0];
          const file = this.data.savedFiles[index];
          this._shareFile(file);
        }
      }
    });
  },
  
  // 内部方法：分享单个文件
  _shareFile: function(file) {
    // 微信小程序中的分享功能有限制，只能分享到聊天
    wx.showModal({
      title: '分享文件',
      content: '您可以通过以下方式分享文件：\n1. 长按文件后选择"分享"\n2. 使用"打开方式"选择其他应用',
      showCancel: false,
      confirmText: '知道了'
    });
    
    // 尝试使用分享API（可能不支持文件分享）
    wx.showShareMenu({
      withShareTicket: true,
      menus: ['shareAppMessage', 'shareTimeline']
    });
    
    // 如果是图片，可以尝试保存到相册后分享
    if (file.type !== 'pdf') {
      wx.showModal({
        title: '保存到相册',
        content: '是否将图片保存到相册后分享？',
        success: (res) => {
          if (res.confirm) {
            wx.saveImageToPhotosAlbum({
              filePath: file.path,
              success: () => {
                wx.showToast({
                  title: '已保存到相册',
                  icon: 'success'
                });
              },
              fail: (err) => {
                console.error('保存图片失败:', err);
                wx.showToast({
                  title: '保存图片失败',
                  icon: 'none'
                });
              }
            });
          }
        }
      });
    }
  },
  
  // 使用其他应用打开
  openWithOtherApp: function(e) {
    const index = e.currentTarget.dataset.index;
    const file = this.data.savedFiles[index];
    
    if (!file || !file.path) {
      wx.showToast({
        title: '文件路径无效',
        icon: 'none'
      });
      return;
    }
    
    // 微信小程序中打开其他应用的功能有限
    if (file.type === 'pdf') {
      wx.openDocument({
        filePath: file.path,
        showMenu: true, // 显示右上角菜单，可以选择其他应用打开
        success: () => {
          console.log('打开PDF文件成功');
        },
        fail: (err) => {
          console.error('打开PDF文件失败:', err);
          wx.showToast({
            title: '无法打开PDF文件',
            icon: 'none'
          });
        }
      });
    } else {
      // 对于图片，可以保存到相册后使用其他应用打开
      wx.saveImageToPhotosAlbum({
        filePath: file.path,
        success: () => {
          wx.showModal({
            title: '已保存到相册',
            content: '图片已保存到相册，您可以在相册中选择"使用其他应用打开"',
            showCancel: false
          });
        },
        fail: (err) => {
          console.error('保存图片失败:', err);
          wx.showToast({
            title: '保存图片失败',
            icon: 'none'
          });
        }
      });
    }
  },
  
  // 触摸开始事件
  touchStart: function(e) {
    // 多选模式下不处理滑动
    if (this.data.isMultiSelectMode) return;
    
    if (e.touches.length === 1) {
      this.setData({
        startX: e.touches[0].clientX
      });
    }
  },
  
  // 触摸移动事件
  touchMove: function(e) {
    // 多选模式下不处理滑动
    if (this.data.isMultiSelectMode) return;
    
    if (e.touches.length === 1) {
      const moveX = e.touches[0].clientX;
      const distance = this.data.startX - moveX;
      
      const index = e.currentTarget.dataset.index;
      let savedFiles = this.data.savedFiles;
      
      // 只允许向左滑动（显示删除按钮）
      if (distance > 0) {
        // 最大滑动距离为删除按钮宽度
        if (distance <= 160) {
          // 更新当前文件的showDelete状态
          savedFiles[index].showDelete = distance > 80; // 滑动超过一半距离时显示删除按钮
          this.setData({
            savedFiles: savedFiles
          });
        }
      } else if (distance < 0) {
        // 向右滑动时隐藏删除按钮
        savedFiles[index].showDelete = false;
        this.setData({
          savedFiles: savedFiles
        });
      }
    }
  },
  
  // 触摸结束事件
  touchEnd: function(e) {
    // 多选模式下不处理滑动
    if (this.data.isMultiSelectMode) return;
    
    const index = e.currentTarget.dataset.index;
    let savedFiles = this.data.savedFiles;
    
    // 根据最终状态决定是否显示删除按钮
    if (savedFiles[index].showDelete === undefined || savedFiles[index].showDelete === null) {
      savedFiles[index].showDelete = false;
    }
    
    this.setData({
      savedFiles: savedFiles
    });
  },
  
  // 删除文件
  deleteFile: function(e) {
    const index = e.currentTarget.dataset.index;
    const file = this.data.savedFiles[index];
    
    if (!file || !file.path) {
      wx.showToast({
        title: '文件路径无效',
        icon: 'none'
      });
      return;
    }
    
    wx.showModal({
      title: '确认删除',
      content: '确定要删除此文件吗？此操作不可恢复。',
      success: (res) => {
        if (res.confirm) {
          this._deleteFileByIndex(index);
        }
      }
    });
  },
  
  // 删除选中的文件
  deleteSelectedFiles: function() {
    if (this.data.selectedFiles.length === 0) return;
    
    wx.showModal({
      title: '确认删除',
      content: `确定要删除选中的${this.data.selectedFiles.length}个文件吗？此操作不可恢复。`,
      success: (res) => {
        if (res.confirm) {
          // 获取当前用户的唯一标识
          const userInfo = wx.getStorageSync('userInfo') || {};
          const openId = userInfo.openId || 'default_user';
          
          // 使用用户特定的键名来存储文件记录
          const savedFilesKey = `savedFiles_${openId}`;
          let savedFiles = this.data.savedFiles;
          const fs = wx.getFileSystemManager();
          
          // 按索引从大到小排序，以便从后往前删除
          const sortedIndices = [...this.data.selectedFiles].sort((a, b) => b - a);
          let successCount = 0;
          let failCount = 0;
          
          // 删除每个选中的文件
          for (const index of sortedIndices) {
            const file = savedFiles[index];
            
            try {
              fs.unlinkSync(file.path);
              console.log('文件删除成功:', file.path);
              
              // 从列表中移除
              savedFiles.splice(index, 1);
              successCount++;
            } catch (err) {
              console.error('删除文件失败:', err);
              failCount++;
            }
          }
          
          // 更新存储
          wx.setStorageSync(savedFilesKey, savedFiles);
          
          // 更新界面
          this.setData({
            savedFiles: savedFiles,
            isMultiSelectMode: false,
            selectedFiles: []
          });
          
          if (failCount === 0) {
            wx.showToast({
              title: `成功删除${successCount}个文件`,
              icon: 'success'
            });
          } else {
            wx.showModal({
              title: '删除结果',
              content: `成功删除${successCount}个文件，${failCount}个文件删除失败`,
              showCancel: false
            });
          }
        }
      }
    });
  },
  
  // 内部方法：通过索引删除文件
  _deleteFileByIndex: function(index) {
    // 获取当前用户的唯一标识
    const userInfo = wx.getStorageSync('userInfo') || {};
    const openId = userInfo.openId || 'default_user';
    
    // 使用用户特定的键名来存储文件记录
    const savedFilesKey = `savedFiles_${openId}`;
    let savedFiles = this.data.savedFiles;
    const file = savedFiles[index];
    
    // 删除文件
    const fs = wx.getFileSystemManager();
    try {
      fs.unlinkSync(file.path);
      console.log('文件删除成功:', file.path);
      
      // 从列表中移除
      savedFiles.splice(index, 1);
      
      // 更新存储
      wx.setStorageSync(savedFilesKey, savedFiles);
      
      // 更新界面
      this.setData({
        savedFiles: savedFiles
      });
      
      wx.showToast({
        title: '删除成功',
        icon: 'success'
      });
    } catch (err) {
      console.error('删除文件失败:', err);
      wx.showToast({
        title: '删除失败',
        icon: 'none'
      });
    }
  },
  
  // 返回首页
  goBack: function() {
    wx.switchTab({
      url: '/pages/index/index',
      fail: function() {
        // 如果switchTab失败（可能不是tabBar页面），则使用reLaunch
        wx.reLaunch({
          url: '/pages/index/index'
        });
      }
    });
  },
  
  // 清除缓存
  clearCache: function() {
    wx.showModal({
      title: '清除缓存',
      content: '确定要清除所有临时文件和缓存吗？这不会删除您已保存的文件。',
      success: (res) => {
        if (res.confirm) {
          // 清除临时文件目录
          const fs = wx.getFileSystemManager();
          const tempDir = `${wx.env.USER_DATA_PATH}/temp/`;
          
          try {
            // 检查目录是否存在
            try {
              fs.accessSync(tempDir);
              
              // 读取目录下的所有文件
              const files = fs.readdirSync(tempDir);
              
              // 删除每个文件
              files.forEach(file => {
                try {
                  fs.unlinkSync(`${tempDir}${file}`);
                } catch (e) {
                  console.error('删除临时文件失败:', e);
                }
              });
              
              wx.showToast({
                title: '缓存已清除',
                icon: 'success'
              });
            } catch (e) {
              // 目录不存在，创建它
              fs.mkdirSync(tempDir, true);
              wx.showToast({
                title: '无缓存需清除',
                icon: 'none'
              });
            }
          } catch (err) {
            console.error('清除缓存失败:', err);
            wx.showToast({
              title: '清除缓存失败',
              icon: 'none'
            });
          }
        }
      }
    });
  }
})